package _06reflect;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.util.Properties;

/**
 * @description:
 * @author: 景天
 * @date: 2022/7/18 14:55
 **/

/*
配置文件与网络编程(UDP)结合练习
自动回复机器人
定义2个类 Sender,Receiver
    Sender向Receiver发送数据,并且接收Receiver的数据
    Receiver接收Sender的数据,并且根据Sender发的数据进行自动回复
如何自动回复?
    定义一个数据字典,说白了就是存放一些Receiver可能的回答,将这些可能的回答放在配置文件中
    比如:
    Sender发送 "在吗"? Receiver回复 "在", 那么这个"在"就事先放到配置文件里面---->  在吗=在
    Receiver在收到Sender发送的消息的时候,去数据字典里(也就是配置文件)去找相应的回答,如果没找到就回复 "我没听懂你在说什么"
    回复的内容可以自由发挥,都是以key=value的形式放在配置文件里就行

 */
public class Receiver {
    static Properties properties = new Properties();

    static {
        InputStream in = ClassLoader.getSystemResourceAsStream("homework\\_06reflect\\dict.properties");
        // 使用字符流load配置文件
        try {
            properties.load(new InputStreamReader(in, "GBK"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) throws IOException {
        String receivePort = properties.getProperty("receivePort");

        // 创建接收端Socket对象
        DatagramSocket datagramSocket = new DatagramSocket(Integer.parseInt(receivePort));
        // while
        while (true) {
            // 接收Sender的消息
            String receiveMsg = receiveMsg(datagramSocket);
            System.out.println(receiveMsg);
            // 从数据字典中找相应的回复
            // 要回复的消息
            String responseMsg = null;
            responseMsg= properties.getProperty(receiveMsg);
            // 找到了 直接回复
            if (responseMsg == null) {
                // 没找到 回复"我没听懂你在说什么"
                responseMsg = "我没听懂你在说什么";
            }
            // 给Sender回复消息
            String sendIp = properties.getProperty("sendIp");
            String sendPort = properties.getProperty("sendPort");
            DatagramPacket sendPacket = NetworkUtils.getSendPacket(responseMsg, sendIp, Integer.parseInt(sendPort));
            datagramSocket.send(sendPacket);


        }
    }

    private static String receiveMsg(DatagramSocket datagramSocket) throws IOException {
        // 创建用于接收的数据报包
        DatagramPacket receivePacket = NetworkUtils.getReceivePacket();
        // receive接收数据
        datagramSocket.receive(receivePacket);
        // 解析数据
        return NetworkUtils.parseMsg(receivePacket);
    }
}
